package dry.example.jcef;


import me.friwi.jcefmaven.CefAppBuilder;
import me.friwi.jcefmaven.CefBuildInfo;
import me.friwi.jcefmaven.MavenCefAppHandlerAdapter;
import org.cef.CefApp;
import org.cef.CefClient;
import org.cef.browser.CefBrowser;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

/**
 * @author lingkang
 * @created in 2023/9/22
 **/
public class Demo01 {
    public static void main(String[] args) throws Exception {
        CefAppBuilder builder = new CefAppBuilder();
        // window下不需要OSR
        boolean useOSR = false;
        builder.getCefSettings().windowless_rendering_enabled = useOSR;
        builder.setAppHandler(new MavenCefAppHandlerAdapter() {
            @Override
            public void stateHasChanged(org.cef.CefApp.CefAppState state) {
                // 关闭应用时退出jvm运行
                if (state == CefApp.CefAppState.TERMINATED) {
                    System.exit(0);
                }
            }
        });

        // 设置cef运行参数，这里为空
        builder.addJcefArgs(args);

        // 设置 cef chrome实例的目录，关键，若不设置他会默认从网络中下载，国外网络可能下载不稳定导致失败
        // 我的 cef chrome 位于项目的chrome目录下 C:\Users\Administrator\Desktop\project\java\demo-desktop\chrome
        builder.setInstallDir(new File(System.getProperty("user.dir") + File.separator + "chrome"));
        // 由于是手动设置cef的chrome，我们要跳过ins检查，防止版本不一致导致从镜像站下载
        builder.setSkipInstallation(true);

        // 全局的 CefApp 每个程序只能有一个，线程安全
        CefApp build = builder.build();
        // 显示一些版本信息
        CefBuildInfo buildInfo = CefBuildInfo.fromClasspath();
        System.out.println(buildInfo);
        CefApp.CefVersion cefVersion = build.getVersion();
        System.out.println(cefVersion);

        // 创建一个浏览器客户端实例
        CefClient client = build.createClient();

        boolean isTransparent = true;// 透明背景

        // 创建一个浏览器实例，设置访问 url https://www.baidu.com
        CefBrowser browser = client.createBrowser("http://www.ip33.com/browser.html", useOSR, isTransparent);
        // 获取UI组件
        Component uiComponent = browser.getUIComponent();
        // 获得键盘焦点事件
        uiComponent.addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {
                System.out.println("获得键盘焦点事件");
            }

            @Override
            public void focusLost(FocusEvent e) {
                System.out.println("失去键盘焦点事件");
            }
        });
        // 添加一个鼠标点击监听
        uiComponent.addMouseListener(new MouseAdapter() {
            int i = 0;

            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println(e);
                if (i % 2 == 0) // 执行JavaScript命令
                {
                    browser.executeJavaScript("alert('鼠标点击')", null, 1);

                }
                i++;
            }
        });



        // 创建 JFrame UI 用于放入chrome
        JFrame main = new JFrame("lingkang");
        main.getContentPane().add(uiComponent, BorderLayout.CENTER);
        main.setSize(1280, 720);//大小
        main.setLocation(0, 0);//位置

        main.setVisible(true);//显示
        main.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                // 关闭应用时要释放资源
                CefApp.getInstance().dispose();
                main.dispose();
                System.exit(0);//0正常退出，1非正常退出
            }
        });
    }
}


